/** * Copyright (c) 2009-2010, Skype Technologies S.A. All rights reserved. * Originally partly based on YUI library (http://developer.yahoo.com/yui/), * also some techniques from jQuery library (http://www.jquery.com/). * Version: 2.0 */ /** * The SKYPE object is the single global object used by Skype Common Library. * It contains utility functions for strings, arrays, cookies, preferences, and * logging. SKYPE.util, SKYPE.user are namespaces created automatically for * and used by the library. * @module skype * @title SKYPE Global */ if (typeof SKYPE == "undefined") { /** * The SKYPE global namespace object * @class SKYPE * @static */ var SKYPE = {}; } /** * Returns the namespace specified and creates it if it doesn't exist *
 * SKYPE.namespace("property.package");
 * SKYPE.namespace("SKYPE.property.package");
 * 
* Either of the above would create SKYPE.property, then * SKYPE.property.package * * Be careful when naming packages. Reserved words may work in some browsers * and not others. For instance, the following will fail in Safari: *
 * SKYPE.namespace("really.long.nested.namespace");
 * 
* This fails because "long" is a future reserved word in ECMAScript * * @method namespace * @static * @param {String*} arguments 1-n namespaces to create * @return {Object} A reference to the last namespace object created */ SKYPE.namespace = function() { var a=arguments, o=null, i, j, d; for (i=0; i -1 || document.cookie.indexOf("debug") > -1 || location.search.indexOf("debug") > -1 ); if (!SKYPE.__log_enabled) return; SKYPE.__log_type = null; if (typeof YAHOO != "undefined" && YAHOO.widget && YAHOO.widget.Logger && YAHOO.widget.Logger.log) SKYPE.__log_type = "yui"; else if (SKYPE.util.Browser.isGecko && typeof console != "undefined" && typeof console.log != "undefined") SKYPE.__log_type = "firebug"; else if (SKYPE.util.Browser.isSafari && typeof window.console != "undefined" && typeof window.console.log != "undefined") SKYPE.__log_type = "webkit"; else if (SKYPE.util.Browser.isOpera && typeof opera == "object" && typeof opera.postError != "undefined") SKYPE.__log_type = "opera"; else if (typeof console != "undefined" && (typeof console.log == "function" || typeof console.log == "object")) SKYPE.__log_type = "native"; } if (!SKYPE.__log_enabled) return; switch (SKYPE.__log_type) { // YUI logger case "yui": return YAHOO.widget.Logger.log(msg, cat, src); break; // Firefox Firebug case "firebug": if (cat && (typeof console[cat] != "undefined")) console[cat](msg); else console.log((cat ? "["+cat.toUpperCase()+"] " : "") + msg); break; // Safari/WebKit JS console case "webkit": window.console.log((cat ? "["+cat.toUpperCase()+"] " : "") + msg); break; // Opera error console case "opera": opera.postError((cat ? "["+cat.toUpperCase()+"] " : "") + msg); break; case "native": console.log((cat ? "["+cat.toUpperCase()+"] " : "") + msg); } }; /** * Registers a module with the SKYPE object * @method register * @static * @param {String} name the name of the module (event, slider, etc) * @param {Function} mainClass a reference to class in the module. This * class will be tagged with the version info * so that it will be possible to identify the * version that is in use when multiple versions * have loaded * @param {Object} data metadata object for the module. Currently it * is expected to contain a "version" property * and a "build" property at minimum. */ SKYPE.register = function(name, mainClass, data) { var mods = SKYPE.env.modules; if (!mods[name]) { mods[name] = { versions:[], builds:[] }; } var m=mods[name],v=data.version,b=data.build,ls=SKYPE.env.listeners; m.name = name; m.version = v; m.build = b; m.versions.push(v); m.builds.push(b); m.mainClass = mainClass; // fire the module load listeners for (var i=0;i *
name:
The name of the module
*
version:
The version in use
*
build:
The build number in use
*
versions:
All versions that were registered
*
builds:
All builds that were registered.
*
mainClass:
An object that was was stamped with the * current version and build. If * mainClass.VERSION != version or mainClass.BUILD != build, * multiple versions of pieces of the library have been * loaded, potentially causing issues.
* * * @method getVersion * @static * @param {String} name the name of the module (event, slider, etc) * @return {Object} The version info */ SKYPE.env.getVersion = function(name) { return SKYPE.env.modules[name] || null; }; SKYPE.namespace("util", "user"); SKYPE.util.Browser = function() { // Partly from ExtJS lib var ua = navigator.userAgent.toLowerCase(); var isStrict = document.compatMode == "CSS1Compat"; var isOpera = ua.indexOf("opera") > -1; var isSafari = /webkit|khtml/.test(ua); var isIE = ua.indexOf("msie") > -1; var isIE7 = ua.indexOf("msie 7") > -1; var ieVer = ua.match(/msie (\d+)/i) ? parseInt(ua.match(/msie (\d+)/i)[1]) : 0; var isGecko = !isSafari && ua.indexOf("gecko") > -1; var isBorderBox = isIE && !isStrict; var isWindows = (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1); var isMac = (ua.indexOf("macintosh") != -1 || ua.indexOf("mac os x") != -1); var isLinux = /x11|linux|freebsd|netbsd/.test(ua); var isHtmlVideo = function (){ var detect = document.createElement('video') || false; var htmlVideo = detect && (typeof detect.canPlayType !== "undefined"); return (htmlVideo == true); }(); var isHtmlVideoMp4 = function(){ var detect = document.createElement('video') || false; if (isIE) { return false; } var htmlVideoMp4 = detect && (typeof detect.canPlayType !== "undefined") && (detect.canPlayType("video/mp4") === "maybe" || detect.canPlayType("video/mp4") === "probably"); return (htmlVideoMp4 == true); }(); var isMacOld = function() { if (!isMac) { return false; } var required = { major: 10, middle: 5, minor: 8 }; var osVersion = ua.match(/mac os x ([._0-9]+)/); if (osVersion && osVersion[1]) { var ver = osVersion[1].split('_'); if (ver.length == 1) { ver = osVersion[1].split('.'); } if (ver.length == 1) { return true; } if (ver[0] < required.major || (ver[0] == required.major && ver[1] < required.middle)) { return true; } if (ver[0] > required.major || (ver[0] == required.major && ver[1] > required.middle)) { return false; } if (ver.length == 3) { if (ver[1] == required.middle && ver[2] >= required.minor) { return false; } } } else if (ua.match(/(ipad|iphone)/)) { return false; } return true; }(); return { isStrict: isStrict ,isOpera: isOpera ,isSafari: isSafari ,isIE: isIE ,isIE7: isIE7 ,ieVer: ieVer ,isGecko: isGecko ,isBorderBox: isBorderBox ,isWindows: isWindows ,isMac: isMac ,isMacOld: isMacOld ,isLinux: isLinux ,isHtmlVideo: isHtmlVideo ,isHtmlVideoMp4: isHtmlVideoMp4 }; }(); SKYPE.util.Createnodes = function() { if (navigator.userAgent.toLowerCase().match("msie")) { var n = ("abbr article aside audio canvas details figcaption figure footer header hgroup mark meter nav output progress section summary time video").split(" "); for (var i in n) { document.createElement(n[i]);} } }(); /** * Utility method for extending an object with another object. * * Mostly from jQuery lib * * @method extend * @static * @param {Object} Target object to extend * @param {Object*} 1..n number of objects to merge to the first one * @return {Object} Returns the extended object, that was supplied as first parameter */ SKYPE.util.extend = function() { var _isArray = function( obj ) { return toString.call(obj) === "[object Array]"; }, _isPlainObject = function( o ) { var hasOwnProperty = Object.prototype.hasOwnProperty; // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { return false; } // Not own constructor property must be Object if ( obj.constructor && !hasOwnProperty.call(obj, "constructor") && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwnProperty.call( obj, key ); }, _extend = function() { // copy reference to target object var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && typeof target !== "function" ) { target = {}; } // nothing to extend if 1 argument if ( length === i ) { return; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging object literal values or arrays if ( deep && copy && ( _isPlainObject(copy) || _isArray(copy) ) ) { var clone = src && ( _isPlainObject(src) || _isArray(src) ) ? src : _isArray(copy) ? [] : {}; // Never move original objects, clone them target[ name ] = _extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; return _extend; }(); /** * Boot loader utility * * Gives SKYPE core utility to load additional javascript as modules. * * @class Loader * @author Martin Kapp * @version 1.0.4 * @site http://www.skype.com/ */ SKYPE.env.Loader = (function() { // Internal list var _required = {}, modules = {}, readyCalled = false, modulesLoaded = false, windowLoaded = false, _onloadEvents = []; var _prefix = '/'; if ( typeof SKYPE != 'undefined' && SKYPE.settings && SKYPE.settings.assetsPath ) { _prefix = SKYPE.settings.assetsPath + (SKYPE.settings.assetsPath.substr(-1) == '/' ? '' : '/'); } var _executeLoadEvents = function () { // Avoid infinite recursion if an onload function calls ourself var onloads = _onloadEvents; _onloadEvents = []; var l = onloads.length; for (var i = 0; i < l; i++) { onloads[i](); } }; var addLoadEvent = function(func) { if (typeof window.onload !== 'function') { window.onload = _executeLoadEvents; } else if (window.onload !== _executeLoadEvents) { // Somebody has overwritten window.onload, add it to queue _onloadEvents.push(window.onload); window.onload = _executeLoadEvents; } _onloadEvents.push(func); }; addLoadEvent(function() { windowLoaded = true; }); // Load all the SCRIPTS var _loadDependencyTree = function( list ) { if ( typeof list == 'undefined' ) { list = _required; } var ready = []; for ( var i in list ) { if ( typeof list[i].loaded == 'undefined' ) { if (typeof list[i].loadcheck != 'undefined') { // Supports functions as conditions, @since 1.0.4 if (typeof list[i].loadcheck == 'function' && list[i].loadcheck()) { SKYPE.log('Mod ' + i + ' marked as loaded', 'warn'); ready.push(i); continue; } else if (typeof list[i].loadcheck != 'function' && list[i].loadcheck) { SKYPE.log('Mod ' + i + ' marked as loaded', 'warn'); ready.push(i); continue; } } if ( typeof list[i].requires == 'undefined' ) { ready.push(i); } else if ( typeof list[i].requires == 'object' ) { var modReady = true; for ( var j in list[i].requires ) { var mod = list[j]; if ( typeof mod.loaded == 'undefined' || !mod.loaded ) { modReady = false; if (typeof mod.loadcheck != 'undefined') { // Supports functions as conditions, @since 1.0.4 if (typeof mod.loadcheck == 'function') { modReady = mod.loadcheck(); } else if (typeof mod.loadcheck != 'function' && mod.loadcheck) { modReady = true; } } } } if ( modReady ) { ready.push(i); } } } } if ( ready.length ) { SKYPE.log( 'Ready to load ' + ready.toString(), 'info' ); for ( var i = 0, len = ready.length; i < len; i++ ) { list[ ready[i] ].loaded = false; if (typeof list[ready[i]].loadcheck != 'undefined') { // Supports functions as conditions, @since 1.0.4 if (typeof list[ready[i]].loadcheck == 'function') { list[ready[i]].loaded = list[ready[i]].loadcheck(); if (list[ready[i]].loaded) { SKYPE.log('Mod already loaded ' + ready[i], 'info'); continue; } } else if (typeof list[ready[i]].loadcheck != 'function' && list[ready[i]].loadcheck) { list[ready[i]].loaded = true; SKYPE.log('Mod already loaded ' + ready[i], 'info'); continue; } } (function() { var inc = ready[i], prefix = list[inc].prefix || _prefix; _insertScript( prefix + '' + list[ inc ].src, 'utf-8', function() { SKYPE.log( 'Done loading ' + inc, 'info' ); list[inc].loaded = true; // If init parameters are supplied and module is registered, call init if ( list[inc].init ) { if ( null !== ( mod = SKYPE.env.getVersion(inc) )) { if ( mod.mainClass && mod.mainClass.init && typeof mod.mainClass.init == 'function' ) { SKYPE.log( 'Calling init on ' + inc, 'info' ); mod.mainClass.init( list[inc].init ); } } } _loadDependencyTree(); }); })(); } } }, // Inserts new SCRIPT tag to the HTML then cleans it up afterwards _insertScript = function( url, scriptCharset, callback ) { var head = document.getElementsByTagName("head")[0] || document.documentElement; var script = document.createElement("script"); script.src = url; if ( scriptCharset ) { script.charset = scriptCharset; } // Handle Script loading var done = false; // Attach handlers for all browsers script.onload = script.onreadystatechange = function() { if ( !done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") ) { done = true; // Handle memory leak in IE script.onload = script.onreadystatechange = null; if ( head && script.parentNode ) { head.removeChild( script ); } if ( typeof callback == 'function' ) { callback(); } } }; // Use insertBefore instead of appendChild to circumvent an IE6 bug. // This arises when a base node is used (#2709 and #4378). head.insertBefore( script, head.firstChild ); // We handle everything using the script element injection return undefined; }; /** * Load module info */ _insertScript( _prefix + 'i/js/skype-common-modules.js?' + (new Date()).getTime(), 'utf-8', function() { SKYPE.log( 'Core modules loaded', 'info' ); var loadCommon = function( name, opts ) { if ( opts && typeof opts.condition != 'undefined' && opts.condition == false ) { SKYPE.log('Pass mod ' + name + ' – no condition', 'info'); if ( typeof opts.skiprequired == 'undefined' ) { opts.skiprequired = []; } return false; } _required[name] = SKYPE.util.extend( modules[name], opts ); opts = _required[name]; // Load module dependencies if ( opts && opts.requires ) { for ( var i in opts.requires) { var added = loadCommon( i, opts.requires[i] ); if ( !added ) { delete opts.requires[i]; } } } return true; }; for ( var i in _required ) { loadCommon( i, _required[i] ); } modulesLoaded = true; if ( readyCalled ) { _loadDependencyTree(); } }); // Expose Loader methods return { // Add available module info addModules: function( coreModules ) { modules = SKYPE.util.extend( {}, modules, coreModules ); }, // Function to add required modules require: function( module, opts, initParams ) { if (typeof opts != 'object') { opts = null; } // Check if condition is supplied and is valid if ( opts && typeof opts.condition != 'undefined' ) { if ( !opts.condition ) { return false; } } if ( !modulesLoaded ) { if ( typeof opts == 'object' ) { if ( _required[module] ) { _required[module] = SKYPE.util.extend( _required[module], opts ); } else { _required[module] = opts; } } else { _required[module] = {}; } } else { // Add module to the required list if ( module in modules ) { _required[module] = modules[module]; if ( opts ) { _required[module] = SKYPE.util.extend( _required[module], opts ); } opts = _required[module]; } else if ( opts && opts.src ) { if ( _required[module] ) { _required[module] = SKYPE.util.extend( _required[module], opts ); } else { _required[module] = opts; } } } // Check if init needs to be called when done if ( typeof initParams != 'undefined' ) { if ( typeof _required[ module ].init == 'undefined' ) { _required[ module ].init = []; } _required[ module ].init.push( initParams ); } // Load module dependencies if ( opts && opts.requires ) { for ( var i in opts.requires) { var added = this.require( i, opts.requires[i] ); if ( !added ) { delete opts.requires[i]; } } } return true; }, // Function that loads required javascripts ready: function() { SKYPE.register("loader", SKYPE.env.Loader, {version: "1.0.4", build: "5"}); readyCalled = true; if ( modulesLoaded ) { _loadDependencyTree(); } }, load: function( script, charset, callback ) { _insertScript( script, charset, callback ); }, windowLoad: function(fn) { if (windowLoaded) { fn(); } else { addLoadEvent(fn); } } }; })(); /* Settings */ /* @legal: Cookie handling code from the book "JavaScript: The Definitive Guide" by David Flanagan published by O'Reilly. ISBN: 0-596-00048-0 */ SKYPE.util.Cookie = function(document, name, hours, path, domain, secure, fieldsep, valuesep) { this.document = document; this.name = name; if (hours) { this.expiration = new Date((new Date()).getTime() + hours*3600000); } else { this.expiration = null; } this.path = path ? path : null; this.domain = domain ? domain : null; this.secure = secure ? true : false; this.fieldsep = fieldsep ? fieldsep : ':'; this.valuesep = valuesep ? valuesep : '&'; this.isSimpleValue = false; // Actual cookie data is held in this one this.data = {}; }; SKYPE.util.Cookie.prototype = { /** * Saves values set in cookie. */ store: function (doSort) { var cookieval = ""; var cookie = ""; var keys = []; if (typeof this.data == "object") { for(var prop in this.data) { keys.push(prop); } if (doSort) keys.sort(); for (var i=0; i < keys.length; i++) { if (cookieval != "") cookieval += this.fieldsep; cookieval += keys[i] + this.valuesep + escape(this.data[keys[i]]); } } else { cookieval = escape(this.data.toString()); } cookie = this.name + '=' + cookieval; if (this.expiration) cookie += '; expires=' + this.expiration.toGMTString(); if (this.path) cookie += '; path=' + this.path; if (this.domain) cookie += '; domain=' + this.domain; if (this.secure) cookie += '; secure'; this.document.cookie = cookie; }, /** * Loads values from cookie */ load: function() { if (this.isSimpleValue && typeof this.data != "string") this.data = this.data.toString(); var allcookies = this.document.cookie; if (allcookies == "") return false; var start = allcookies.indexOf(this.name + '='); if (start == -1) return false; start += this.name.length + 1; var end = allcookies.indexOf(';', start); if (end == -1) end = allcookies.length; var cookieval = allcookies.substring(start, end); if (!this.isSimpleValue) { var a = cookieval.split(this.fieldsep); for (var i=0; i < a.length; i++) a[i] = a[i].split(this.valuesep); for (var i = 0; i < a.length; i++) this.data[a[i][0]] = unescape(a[i][1]); } else { this.data = cookieval; } return true; }, /** * Removes cookie if it was set. */ remove: function() { var cookie = this.name + '='; if (this.path) cookie += '; path=' + this.path; if (this.domain) cookie += '; domain=' + this.domain; cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT'; this.document.cookie = cookie; } }; /** * Skype Preference Cookie Handling */ SKYPE.user.Preferences = function() { var values = { 'LC':'' ,'CCY':'' ,'CC':'' ,'TZ':'' ,'VER':'' ,'TS':'' ,'TM':'' ,'VAT':'' ,'UCP':'' ,'ENV':'' }; var domain = null; var cookieName = "SC"; var cookie = null; var path = "/"; var secure = false; var expires = null; var _parsing = false; var platformNames = { '0':'windows' ,'1':'pocketpc' ,'2':'linux' ,'3':'osx' }; return { init: function() { this.setDomain(); expires = 365; this.parseCookie(); }, getCookie: function() { var c = new SKYPE.util.Cookie(document, cookieName, expires, path, domain, secure, ":", "="); c.load(); return c; }, scrubCookieValue: function(value) { return value.replace(/[\n\r]/g, "").replace(//g, ">"); }, setDomain: function(dom) { if (dom) { domain = dom; } else if (location && location.hostname) { var parts = location.hostname.split("."); var i = parts.length; if (i >= 2 && isNaN(parseInt(parts[i-1]))) { domain = "."+parts[i-2]+"."+parts[i-1]; } } }, parseCookie: function() { cookie = this.getCookie(); var knownSetters = { 'LC': 'setLanguage' ,'CCY': 'setCurrency' ,'CC': 'setCountryCode' ,'TZ': 'setTimezone' ,'VER': 'setVersion' ,'TS': 'setTimeStamp' ,'TM': 'setTimeModified' ,'VAT': 'setVatEligible' ,'UCP': 'setClientProfile' }; _parsing = true; for (var prop in cookie.data) { if (prop.search(/[A-Z]+/) != -1) { if (knownSetters[prop]) this[knownSetters[prop]](cookie.data[prop]); else this.setValue(prop, cookie.data[prop]); } } _parsing = false; return true; }, save: function() { for (var val in values) { cookie.data[val] = values[val]; } cookie.store(true); }, clear: function() { cookie.remove(); }, getValue: function(key, def) { if (typeof def == "undefined") def = ""; if (values[key] && values[key] != null && values[key].length) return values[key]; return def; }, setValue: function(key, value) { values[key] = value.toString(); }, touchCookie: function() { var now = parseInt(new Date().getTime()/1000); if (_parsing) return false; if (!this.getTimeStamp().length) this.setValue("TS", now); this.setValue("TM", now); return true; }, setLanguage: function(value) { /* TODO: Should do validation here before setting? */ this.setValue("LC", value.replace(/_/g, "-")); this.touchCookie(); return true; }, getLanguage: function(def) { return this.getValue("LC", def); }, setCurrency: function(value) { if (/^([A-Z]{3}|[0-9]{3})$/.test(value) == false) value = ""; this.setValue("CCY", value); this.touchCookie(); return true; }, getCurrency: function(def) { return this.getValue("CCY", def); }, setCountryCode: function(value) { if (/^([A-Z]{2,3}|[0-9]{3})$/.test(value) == false) value = ""; this.setValue("CC", value); this.touchCookie(); return true; }, getCountryCode: function(def) { return this.getValue("CC", def); }, formatDecimal: function(value) { if (value < 10) return "0" + value; return value; }, setTimezone: function(value) { if (/^([-+]((0[0-9]|1[0-3]):[0-5][0-9]|14:00)|Z)$/.test(value) == false) { var matches = value.match(/^([-+]?)([0-9]{1,2})(\.[0-9])?$/); if (matches) { var sign = matches[1] && matches[1].length ? matches[1] : '+'; var hours = parseInt(matches[2]); var minutes = matches[3] && matches[3].length ? parseInt(60 * parseFloat(matches[3])) : 0; if (hours > 14) hours = 14; if (hours == 14) minutes = 0; if (minutes > 59) minutes = 0; value = sign+this.formatDecimal(hours)+":"+this.formatDecimal(minutes); } } this.setValue("TZ", value); this.touchCookie(); return true; }, getTimezone: function(def) { return this.getValue("TZ", def); }, setVersion: function(value) { if (typeof value == "object") { var defaultValues = { 'platform':'' ,'platformname':'' ,'version':'' ,'campaign':'' ,'partner':'' ,'partnername':'' }; for (var prop in defaultValues) { if (value[prop] == null) value[prop] = defaultValues[prop]; } var splitVer = value.version.split("."); value = value.platform+"/"+splitVer[0]+"."+splitVer[1]+"."+(value.partner.length ? value.partner : splitVer[2])+"."+splitVer[3]+"/"+value.campaign; } if (/^[0-9]?\/[0-9]{1,2}(\.[0-9]{1,5}){3}\/[0-9]*$/.test(value) == false) return false; this.setValue("VER", value); this.touchCookie(); return true; }, getVersion: function(def) { return this.getValue("VER", def); }, getParsedVersion: function(def) { var result = { 'platform':'' ,'platformname':'' ,'version':'' ,'campaign':'' ,'partner':'' ,'partnername':'' }; var ver = this.getVersion(def); if (!ver.length) return result; var splitVer = ver.split("/"); result.platform = splitVer[0]; result.version = splitVer[1]; result.campaign = splitVer[2]; splitVer = result.version.split("."); result.partner = (splitVer.length > 2 && splitVer[2]) ? splitVer[2] : 0; return result; }, setTimeStamp: function(value) { this.setValue("TS", value); this.touchCookie(); }, getTimeStamp: function(def) { return parseInt(this.getValue("TS", def)); }, setTimeModified: function(value) { if (_parsing) { this.setValue("TM", value); } this.touchCookie(); }, getTimeModified: function(def) { return parseInt(this.getValue("TM", def)); }, setClientProfile: function(value) { this.setValue("UCP", value); this.touchCookie(); }, getClientProfile: function(def) { return this.getValue("UCP", def); }, setVatEligible: function(value) { var result = ""; // If string was passed in, then only accept "true" and "false" as valid if (typeof value == "string") { if (value == "true") result = "true"; else if (value == "false") result = "false"; else result = ""; } // Turn booleans into strings else if (typeof value == "boolean") { result = value ? "true" : "false"; } // Accept only numbers 0 and 1, nothing else else if (typeof value == "number") { if (value == 1) result = "true"; else if (value == 0) result = "false"; else result = ""; } this.setValue("VAT", result); this.touchCookie(); }, isVatEligible: function() { var val = this.getValue("VAT"); if (val == "true") return true; else if (val == "false") return false; else return null; }, setEnv: function(value) { value = value.replace(/\//g, "-"); if (!this.getEnv(value)) { var env = this.getValue("ENV"); env = env.length ? env.split("/") : []; env.push(value); this.setValue("ENV", env.join("/")); this.touchCookie(); } }, getEnv: function(value) { value = value.replace(/\//g, "-"); var env = this.getValue("ENV").split("/"); for (var i = 0; i < env.length; i++) { if (env[i] === value) return true; } return false; }, deleteEnv: function(value) { var env = this.getValue("ENV").split("/"); for (var i=0; i < env.length; i++) { if (env[i] === value) { env.splice(i, 1); } }; this.setValue("ENV", env.join("/")); this.touchCookie(); }, clearEnv: function() { this.setValue("ENV", ""); this.touchCookie(); }, debug: function() { var result = ""; for (var key in values) { result = result + key + " = " + values[key] + "\n"; } return result; } }; }(); SKYPE.user.Preferences.init(); /** * Site tweaks * * Written as lib independent to reduce overhead of functionality that’s needed on every page */ SKYPE.util.SiteTweaks = function() { SKYPE.env.listeners.push(function( mod ) { if ( mod.name == 'loader' ) { // Input tweaks // Added a hack so this would work for Web reg too var header = document.getElementById('header'); if (!header) { return false; } var inputs = header.getElementsByTagName( 'input' ), i = inputs.length; while (i--) { if (inputs[i].title && inputs[i].type == 'text') { inputs[i].onfocus = function () { if (this.value === this.title) { this.value = ''; } }; inputs[i].onblur = function () { if (this.value === '' || this.value === this.title) { this.value = this.title; } }; if (inputs[i].value === '' || inputs[i].value === inputs[i].title) { inputs[i].value = inputs[i].title; } } } function getElementsByClassName (oElm, strTagName, strClassName) { var arrElements = (strTagName == "*" && oElm.all) ? oElm.all : oElm.getElementsByTagName(strTagName), arrReturnElements = new Array(); strClassName = strClassName.replace(/\-/g, "\\-"); var oElement, oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)"), i = arrElements.length; while (i--) { oElement = arrElements[i]; if (oRegExp.test(oElement.className)) { arrReturnElements.push(oElement); } } return arrReturnElements; }; // check if value is part of an array function inArray (array, value) { var i = array.length; while (i--) { if (array[i] == value) { return true; } } return false; }; // Language selector var el, lDropdowns = getElementsByClassName(document,'select','userLanguage'), upForms = getElementsByClassName(document,'form','userPreferencesForm'); // check if there are language selectors defined by id el = document.getElementById('userLanguage'); if (el && !inArray(lDropdowns, el)) { lDropdowns.push(el); } el = document.getElementById('userPreferencesForm'); if (el && !inArray(upForms, el)) { upForms.push(el); }; for (var i=0; i < lDropdowns.length; i++) { if (lDropdowns[i] && upForms[i]) { lDropdowns[i].onchange = function () { var upForm = this.form, lDropdown = this, ddValue = lDropdown.options[lDropdown.selectedIndex].value, changeUrl = upForm.action.replace(/(%5B|\[)LC(%5D|\])/g, ddValue); if (typeof SKYPE.user.Preferences.setLanguage != "undefined") { SKYPE.user.Preferences.setLanguage(ddValue); SKYPE.user.Preferences.save(); SKYPE.log("Setting user language to: "+ ddValue, "info"); } if (!window.location.hostname.match('login|secure|search|share|support|about|jobs')) { // split window.location into urlArray - protocol+hostname, intl/XX-XXXXX, rest of the url var reg = new RegExp("(^"+window.location.protocol+"//"+window.location.hostname+"/)"+"(intl/[a-zA-Z-]{2,8})?/?(.*)"); var urlArray = reg.exec(window.location); if (typeof urlArray[1] != undefined) { var newLocation = urlArray[1]; newLocation += 'intl/' + ddValue + '/'; if(typeof urlArray[3] != undefined) { newLocation += urlArray[3]; } changeUrl = newLocation; } } window.location = changeUrl; }; if (typeof SKYPE.user.Preferences.getLanguage() != "undefined" && SKYPE.user.Preferences.getLanguage() == "") { SKYPE.user.Preferences.setLanguage(lDropdowns[i].options[lDropdowns[i].selectedIndex].value); SKYPE.user.Preferences.save(); SKYPE.log("Setting user language to: "+ lDropdowns[i].options[lDropdowns[i].selectedIndex].value, "info"); } } else { return; } } // Footer links language selector var languageLinks = getElementsByClassName(document,'a','languageLink'); for (var i = 0; i < languageLinks.length; i++) { if (typeof SKYPE.user.Preferences.setLanguage != "undefined" && typeof SKYPE.user.Preferences.getLanguage() != "undefined" && SKYPE.user.Preferences.getLanguage() == "" && languageLinks[i].className.indexOf('selected') != -1) { SKYPE.user.Preferences.setLanguage(languageLinks[i].hreflang); SKYPE.user.Preferences.save(); SKYPE.log("Setting user language to: "+ languageLinks[i].hreflang, "info"); } languageLinks[i].onclick = function(event) { event.preventDefault(); var linkValue = this.hreflang, changeUrl = this.href; if (typeof SKYPE.user.Preferences.setLanguage != "undefined") { SKYPE.user.Preferences.setLanguage(linkValue); SKYPE.user.Preferences.save(); SKYPE.log("Setting user language to: "+ linkValue, "info"); } if (!window.location.hostname.match('login|secure|search|share|support|about|jobs')) { // split window.location into urlArray - protocol+hostname, intl/XX-XXXXX, rest of the url var reg = new RegExp("(^"+window.location.protocol+"//"+window.location.hostname+"/)"+"(intl/[a-zA-Z-]{2,8})?/?(.*)"); var urlArray = reg.exec(window.location); if (typeof urlArray[1] != undefined && typeof urlArray[3]) { var newLocation = urlArray[1]; newLocation += 'intl/' + linkValue + '/'; if(typeof urlArray[3] != undefined) { newLocation += urlArray[3]; } changeUrl = newLocation; } } window.location = changeUrl; }; } } }); SKYPE.env.Loader.require('sitetweaks', { 'src': 'i/js/jquery/sitetweaks.js', 'requires': { 'jquery' : true } }); }(); /* Load CSS with javascript help */ SKYPE.loadCss = function (filename) { var fileref = document.createElement("link"); fileref.setAttribute("rel", "stylesheet"); fileref.setAttribute("type", "text/css"); fileref.setAttribute("href", filename); if (typeof fileref != "undefined") { document.getElementsByTagName("head")[0].appendChild(fileref); } }; SKYPE.register("skype", SKYPE, {version: "2.0.1", build: "3"});